How to project objects

//Add a layer with features that will be projected on the image
function addProjectionLayer() {
	
	//Line feature
	var line = new ol.Feature(new ol.geom.LineString([[2120056.819353365, 6025119.792111267], [2120064.6571345855, 6025119.41888359]]));

	var point = new ol.Feature(new ol.geom.Point([2120050.997001601, 6025134.1240540715]));
	
	var features = [line, point1, point2];
	
	var style = new ol.style.Style({
	    fill: new ol.style.Fill({
		    color: 'rgba(0, 0, 255, 0.4)'
	    }),
	    stroke: new ol.style.Stroke({
	        color: 'rgba(0, 0, 255, 1)',
	        width: 4
	    }),
	    image: new ol.style.Circle({
		    radius: 10,
		    fill: new ol.style.Fill({
			    color: 'rgba(255, 0, 0, 1)'
		    })
	    })
	});
	
	var vectorLayer = new ol.layer.Vector({
	    source: new ol.source.Vector({
		    features: features
	    }),
	    style: style,
	    name: 'Projections Layer'
	});
	map.addLayer(vectorLayer);
}

//Get map projections that will pe drawn on the image.
ImajnetPlugin.getProjectionCandidates = function(position) {
    var result = jQuery.Deferred();
    
    //Imajnet function that will get the constraint from which the features will be projected
    var constraintGeometry =  ImageControler.currentPhotogrammetry.getProjectionConstraint(position);

    //{arse coordinates
    for(var i = 0; i < constraintGeometry.length; i++) {
	    constraintGeometry[i] = ol.proj.transform([constraintGeometry[i].x, constraintGeometry[i].y], wgs84, webMercator);
    }
    var triangle = new ol.Feature(new ol.geom.Polygon([constraintGeometry]));

    // Build an array with all the features
    var features = new Array();
    features.push(getLayerByName('Projections Layer').getSource().getFeatures());

    var format = new ol.format.GeoJSON();
    var intersectedFeatures = new Array();
    
    //Loop over the features and check if they are in the constraint geometry
    for(var i = 0; i < features.length; i++) {
	    for(var j = 0; j < features[i].length; j++) {
	    	
	    	//An external library that checks for intersection between the feature and the constraint
		    var intersection = turf.intersect(format.writeFeatureObject(triangle), format.writeFeatureObject(features[i][j]));
		    
		    //If an intersection is found add the feature to objects that need to be projected
		    if(intersection) {
			    var geometry = features[i][j].clone().getGeometry();
			    geometry.transform(webMercator, wgs84);
			    var coordinates = geometry.getCoordinates();
			    var type = geometry.getType();
			    
			    //The objects that will be projected must have a feature, a geometry(coordinates) and a style
			    
			    if(type === 'Point') {
				    intersectedFeatures.push({
				        feature: features[i][j],
				        geometry: new Array({
				            lon: coordinates[0],
				            lat: coordinates[1]
				        }),
				        style: getStyleObjectForProjection(features[i][j])
				    });
			    } else if(type === 'LineString') {
				    var pointsArray = new Array();
				    for(var k = 0; k < coordinates.length; k++) {
					    pointsArray.push({
					        lon: coordinates[k][0],
					        lat: coordinates[k][1]
					    })
				    }
				    intersectedFeatures.push({
				        feature: features[i][j],
				        geometry: pointsArray,
				        style: getStyleObjectForProjection(features[i][j])
				    })
			    } else if(type === 'Polygon') {
				    var pointsArray = new Array();
				    coordinatesPolygon = coordinates[0];
				    for(var k = 0; k < coordinatesPolygon.length; k++) {
					    pointsArray.push({
					        lon: coordinatesPolygon[k][0],
					        lat: coordinatesPolygon[k][1]
					    })
				    }
				    intersectedFeatures.push({
				        feature: features[i][j],
				        geometry: pointsArray,
				        style: getStyleObjectForProjection(features[i][j])
				    })
			    }
		    }
	    }
    }
    result.resolve(intersectedFeatures);
    return result.promise();

};


//Function that will return the feature's style in to imajnet format so that it can be drawn in to the image
function getStyleObjectForProjection(feature) {
	var featureStyles = getStyleFromFeature(feature);
	var styleProjections = new Array();
	var type = feature.getGeometry().getType();
	var fill = null;
	var stroke = null;
	jQuery.each(featureStyles, function(key, value) {
		if(type != "Point") {
			fill = value.getFill();
			stroke = value.getStroke();
			styleProjections.push({
			    strokeColor: stroke ? stroke.getColor() : '#000000',
			    strokeLinecap: stroke.getLineCap(),
			    strokeWidth: stroke ? stroke.getWidth() : 2,
			    fill: fill ? fill.getColor() : null
			})
		} else if(type === 'Point') {
			var style = {}
			image = value.getImage();
			if(image instanceof ol.style.Icon) {
				style.externalGraphic = image.getSrc();
			} else {
				fill = image.getFill();
				stroke = image.getStroke();
				var radius = image.getRadius();
			}
			if(stroke) {
				style.strokeColor = stroke.getColor();
				style.strokeWidth = stroke.getWidth();
			}
			if(fill) {
				style.fillColor = fill.getColor();
				style.fill = true;
			}
			if(image instanceof ol.style.RegularShape) {
				var points = image.getPoints();
				var radius2 = image.getRadius2();
				var angle = image.getAngle();
				if(radius2 != radius) {
					points = points / 2;
				}
				if(points == 4) {
					if(radius2 == 0) {
						style.graphicName = 'cross';
					} else {
						style.graphicName = 'square';
					}
				} else if(points == 3) {
					style.graphicName = 'triangle';
				}
			}

			style.pointRadius = radius;
			styleProjections.push(style)
		}
	});
	return styleProjections;
}

//Helper functions to highlight the projections
ImajnetPlugin.onFeatureMouseover = function(featureWrapper) {
    ImageControler.currentGraphic.svg.forEach(function(element) {
	    var currentLineFeatureData = element.data('featureData');
	    if(currentLineFeatureData && currentLineFeatureData.featureId == featureWrapper.id) {
		    element.attr({
			    opacity: 0.6
		    });
	    }
    });
    var feature = featureWrapper.feature;
    highlightFeature(feature);
};

ImajnetPlugin.onFeatureMouseout = function(featureWrapper) {
    ImageControler.currentGraphic.svg.forEach(function(element) {
	    var currentLineFeatureData = element.data('featureData');
	    if(currentLineFeatureData && currentLineFeatureData.featureId == featureWrapper.id) {
		    element.attr({
			    opacity: 1
		    });
	    }
    });
    var feature = featureWrapper.feature;
    removeSelect(feature);
};

ImajnetPlugin.onItemMouseOver = function(event, hoveredElement, featureId) {
    ImajnetUI.highlightContainer(hoveredElement);
    highlightFeature(ImajnetMap.getFeatureWrapperById(featureId).getFeature());
};

ImajnetPlugin.onItemMouseOut = function(element, featureId) {
    ImajnetUI.unHighlightContainer(element);
    ImageControler.currentGraphic.featureIdToHighlight = '';
    removeSelect(ImajnetMap.getFeatureWrapperById(featureId).getFeature());
};

function removeSelect(feature) {
	if(!feature.get('isSelected')) {
		return;
	}
	feature.getStyle().pop();
	feature.setStyle(feature.getStyle());
	feature.set('isSelected', false)
}

function highlightFeature(feature) {
	if(feature.get('isSelected')) {
		return;
	}
	var type = feature.getGeometry().getType();
	var style = getStyleFromFeature(feature);
	style.push(selectStyle(type));
	feature.setStyle(style);
	feature.set('isSelected', true);

}

function selectStyle(type) {
	if(type == 'Point') {
		return new ol.style.Style({
		    image: new ol.style.Circle({
		        radius: 6,
		        fill: new ol.style.Fill({
			        color: 'rgba(52, 152, 219, 0.5)'
		        }),
		        stroke: new ol.style.Stroke({
		            color: 'blue',
		            width: 3
		        })
		    }),
		    zIndex: 999
		});
	} else if(type == 'LineString') {
		return new ol.style.Style({
		    stroke: new ol.style.Stroke({
		        color: 'rgba(52, 152, 219, 0.5)',
		        width: 16
		    }),
		    zIndex: 999
		});
	} else if(type == 'Polygon') {
		return new ol.style.Style({
		    stroke: new ol.style.Stroke({
		        color: 'rgba(0, 0, 255, 1)',
		        width: 3
		    }),
		    fill: new ol.style.Fill({
			    color: 'rgba(52, 152, 219, 0.5)'
		    }),
		    zIndex: 999
		});
	}
}